home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / PROLOG / BP330 / !BinPro330 / progs / pbench < prev    next >
Text File  |  1994-11-14  |  46KB  |  2,097 lines

  1. % File   : pereira.pl
  2. % Author : Fernando Pereira / modified by Jacques Noye
  3. %    functor and call tests added by Micha Meier
  4. % Date   : 26 August 88
  5. % Pereira benchmark suite
  6. :-write('use  bp -h20000 -t8000 -s4000 -b10000 -d19 for BinProlog'),nl.
  7. :- dynamic ua/3.
  8. :- dynamic dix/2.
  9.  
  10. % Trivial predicates for use in controls.
  11.  
  12. dummy.
  13.  
  14. dummy(_).
  15.  
  16. dummy(_, _).
  17.  
  18. dummy(_, _, _).
  19.  
  20. % The actual benchmarks
  21.  
  22. % 1. 100 determinate tail calls
  23.  
  24. p100(a).
  25. p99(a) :- p100(a).
  26. p98(a) :- p99(a).
  27. p97(a) :- p98(a).
  28. p96(a) :- p97(a).
  29. p95(a) :- p96(a).
  30. p94(a) :- p95(a).
  31. p93(a) :- p94(a).
  32. p92(a) :- p93(a).
  33. p91(a) :- p92(a).
  34. p90(a) :- p91(a).
  35. p89(a) :- p90(a).
  36. p88(a) :- p89(a).
  37. p87(a) :- p88(a).
  38. p86(a) :- p87(a).
  39. p85(a) :- p86(a).
  40. p84(a) :- p85(a).
  41. p83(a) :- p84(a).
  42. p82(a) :- p83(a).
  43. p81(a) :- p82(a).
  44. p80(a) :- p81(a).
  45. p79(a) :- p80(a).
  46. p78(a) :- p79(a).
  47. p77(a) :- p78(a).
  48. p76(a) :- p77(a).
  49. p75(a) :- p76(a).
  50. p74(a) :- p75(a).
  51. p73(a) :- p74(a).
  52. p72(a) :- p73(a).
  53. p71(a) :- p72(a).
  54. p70(a) :- p71(a).
  55. p69(a) :- p70(a).
  56. p68(a) :- p69(a).
  57. p67(a) :- p68(a).
  58. p66(a) :- p67(a).
  59. p65(a) :- p66(a).
  60. p64(a) :- p65(a).
  61. p63(a) :- p64(a).
  62. p62(a) :- p63(a).
  63. p61(a) :- p62(a).
  64. p60(a) :- p61(a).
  65. p59(a) :- p60(a).
  66. p58(a) :- p59(a).
  67. p57(a) :- p58(a).
  68. p56(a) :- p57(a).
  69. p55(a) :- p56(a).
  70. p54(a) :- p55(a).
  71. p53(a) :- p54(a).
  72. p52(a) :- p53(a).
  73. p51(a) :- p52(a).
  74. p50(a) :- p51(a).
  75. p49(a) :- p50(a).
  76. p48(a) :- p49(a).
  77. p47(a) :- p48(a).
  78. p46(a) :- p47(a).
  79. p45(a) :- p46(a).
  80. p44(a) :- p45(a).
  81. p43(a) :- p44(a).
  82. p42(a) :- p43(a).
  83. p41(a) :- p42(a).
  84. p40(a) :- p41(a).
  85. p39(a) :- p40(a).
  86. p38(a) :- p39(a).
  87. p37(a) :- p38(a).
  88. p36(a) :- p37(a).
  89. p35(a) :- p36(a).
  90. p34(a) :- p35(a).
  91. p33(a) :- p34(a).
  92. p32(a) :- p33(a).
  93. p31(a) :- p32(a).
  94. p30(a) :- p31(a).
  95. p29(a) :- p30(a).
  96. p28(a) :- p29(a).
  97. p27(a) :- p28(a).
  98. p26(a) :- p27(a).
  99. p25(a) :- p26(a).
  100. p24(a) :- p25(a).
  101. p23(a) :- p24(a).
  102. p22(a) :- p23(a).
  103. p21(a) :- p22(a).
  104. p20(a) :- p21(a).
  105. p19(a) :- p20(a).
  106. p18(a) :- p19(a).
  107. p17(a) :- p18(a).
  108. p16(a) :- p17(a).
  109. p15(a) :- p16(a).
  110. p14(a) :- p15(a).
  111. p13(a) :- p14(a).
  112. p12(a) :- p13(a).
  113. p11(a) :- p12(a).
  114. p10(a) :- p11(a).
  115. p9(a) :- p10(a).
  116. p8(a) :- p9(a).
  117. p7(a) :- p8(a).
  118. p6(a) :- p7(a).
  119. p5(a) :- p6(a).
  120. p4(a) :- p5(a).
  121. p3(a) :- p4(a).
  122. p2(a) :- p3(a).
  123. p1(a) :- p2(a).
  124.  
  125. % 2. 63 determinate nontail calls, 64 determinate tail calls.
  126.  
  127. q127(a).
  128. q126(a).
  129. q125(a).
  130. q124(a).
  131. q123(a).
  132. q122(a).
  133. q121(a).
  134. q120(a).
  135. q119(a).
  136. q118(a).
  137. q117(a).
  138. q116(a).
  139. q115(a).
  140. q114(a).
  141. q113(a).
  142. q112(a).
  143. q111(a).
  144. q110(a).
  145. q109(a).
  146. q108(a).
  147. q107(a).
  148. q106(a).
  149. q105(a).
  150. q104(a).
  151. q103(a).
  152. q102(a).
  153. q101(a).
  154. q100(a).
  155. q99(a).
  156. q98(a).
  157. q97(a).
  158. q96(a).
  159. q95(a).
  160. q94(a).
  161. q93(a).
  162. q92(a).
  163. q91(a).
  164. q90(a).
  165. q89(a).
  166. q88(a).
  167. q87(a).
  168. q86(a).
  169. q85(a).
  170. q84(a).
  171. q83(a).
  172. q82(a).
  173. q81(a).
  174. q80(a).
  175. q79(a).
  176. q78(a).
  177. q77(a).
  178. q76(a).
  179. q75(a).
  180. q74(a).
  181. q73(a).
  182. q72(a).
  183. q71(a).
  184. q70(a).
  185. q69(a).
  186. q68(a).
  187. q67(a).
  188. q66(a).
  189. q65(a).
  190. q64(a).
  191. q63(a) :- q126(a), q127(a).
  192. q62(a) :- q124(a), q125(a).
  193. q61(a) :- q122(a), q123(a).
  194. q60(a) :- q120(a), q121(a).
  195. q59(a) :- q118(a), q119(a).
  196. q58(a) :- q116(a), q117(a).
  197. q57(a) :- q114(a), q115(a).
  198. q56(a) :- q112(a), q113(a).
  199. q55(a) :- q110(a), q111(a).
  200. q54(a) :- q108(a), q109(a).
  201. q53(a) :- q106(a), q107(a).
  202. q52(a) :- q104(a), q105(a).
  203. q51(a) :- q102(a), q103(a).
  204. q50(a) :- q100(a), q101(a).
  205. q49(a) :- q98(a), q99(a).
  206. q48(a) :- q96(a), q97(a).
  207. q47(a) :- q94(a), q95(a).
  208. q46(a) :- q92(a), q93(a).
  209. q45(a) :- q90(a), q91(a).
  210. q44(a) :- q88(a), q89(a).
  211. q43(a) :- q86(a), q87(a).
  212. q42(a) :- q84(a), q85(a).
  213. q41(a) :- q82(a), q83(a).
  214. q40(a) :- q80(a), q81(a).
  215. q39(a) :- q78(a), q79(a).
  216. q38(a) :- q76(a), q77(a).
  217. q37(a) :- q74(a), q75(a).
  218. q36(a) :- q72(a), q73(a).
  219. q35(a) :- q70(a), q71(a).
  220. q34(a) :- q68(a), q69(a).
  221. q33(a) :- q66(a), q67(a).
  222. q32(a) :- q64(a), q65(a).
  223. q31(a) :- q62(a), q63(a).
  224. q30(a) :- q60(a), q61(a).
  225. q29(a) :- q58(a), q59(a).
  226. q28(a) :- q56(a), q57(a).
  227. q27(a) :- q54(a), q55(a).
  228. q26(a) :- q52(a), q53(a).
  229. q25(a) :- q50(a), q51(a).
  230. q24(a) :- q48(a), q49(a).
  231. q23(a) :- q46(a), q47(a).
  232. q22(a) :- q44(a), q45(a).
  233. q21(a) :- q42(a), q43(a).
  234. q20(a) :- q40(a), q41(a).
  235. q19(a) :- q38(a), q39(a).
  236. q18(a) :- q36(a), q37(a).
  237. q17(a) :- q34(a), q35(a).
  238. q16(a) :- q32(a), q33(a).
  239. q15(a) :- q30(a), q31(a).
  240. q14(a) :- q28(a), q29(a).
  241. q13(a) :- q26(a), q27(a).
  242. q12(a) :- q24(a), q25(a).
  243. q11(a) :- q22(a), q23(a).
  244. q10(a) :- q20(a), q21(a).
  245. q9(a) :- q18(a), q19(a).
  246. q8(a) :- q16(a), q17(a).
  247. q7(a) :- q14(a), q15(a).
  248. q6(a) :- q12(a), q13(a).
  249. q5(a) :- q10(a), q11(a).
  250. q4(a) :- q8(a), q9(a).
  251. q2(a) :- q4(a), q5(a).
  252. q3(a) :- q6(a), q7(a).
  253. q1(a) :- q2(a), q3(a).
  254.  
  255. % 3. Construct one 100 element list, nonrecursively.
  256.  
  257. % 4. Walk down a 100 element list, nonrecursively
  258.  
  259. % 5. Walk down a 100 element list, recursively
  260.  
  261. % 6. Walk down N 100 copies of the same 100 element list, recursively.
  262.  
  263. wlr([]).
  264. wlr([_|L]) :- wlr(L).
  265.  
  266. wlr([], []).
  267. wlr([_|L1], [_|L2]) :- wlr(L1, L2).
  268.  
  269. wlr([], [], [], []).
  270. wlr([_|L1], [_|L2], [_|L3], [_|L4]) :- wlr(L1, L2, L3, L4).
  271.  
  272. wlr([], [], [], [], [], [], [], []).
  273. wlr([_|L1], [_|L2], [_|L3], [_|L4], [_|L5], [_|L6], [_|L7], [_|L8]) :-
  274.    wlr(L1, L2, L3, L4, L5, L6, L7, L8).
  275.  
  276. wlr([], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []).
  277. wlr([_|L1], [_|L2], [_|L3], [_|L4], [_|L5], [_|L6], [_|L7], [_|L8],
  278.     [_|L9], [_|L10], [_|L11], [_|L12], [_|L13], [_|L14], [_|L15], [_|L16]) :-
  279.    wlr(L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16).
  280.  
  281. args(1).  args(2).  args(4).  args(8).  args(16).
  282.  
  283. args(1, L) :- wlr(L).
  284. args(2, L) :- wlr(L, L).
  285. args(4, L) :- wlr(L, L, L, L).
  286. args(8, L) :- wlr(L, L, L, L, L, L, L, L).
  287. args(16, L) :- wlr(L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L).
  288.  
  289. % Nonrecursive list cruncher
  290.  
  291. r101([]).
  292. r100([100|R]) :- r101(R).
  293. r99([99|R]) :- r100(R).
  294. r98([98|R]) :- r99(R).
  295. r97([97|R]) :- r98(R).
  296. r96([96|R]) :- r97(R).
  297. r95([95|R]) :- r96(R).
  298. r94([94|R]) :- r95(R).
  299. r93([93|R]) :- r94(R).
  300. r92([92|R]) :- r93(R).
  301. r91([91|R]) :- r92(R).
  302. r90([90|R]) :- r91(R).
  303. r89([89|R]) :- r90(R).
  304. r88([88|R]) :- r89(R).
  305. r87([87|R]) :- r88(R).
  306. r86([86|R]) :- r87(R).
  307. r85([85|R]) :- r86(R).
  308. r84([84|R]) :- r85(R).
  309. r83([83|R]) :- r84(R).
  310. r82([82|R]) :- r83(R).
  311. r81([81|R]) :- r82(R).
  312. r80([80|R]) :- r81(R).
  313. r79([79|R]) :- r80(R).
  314. r78([78|R]) :- r79(R).
  315. r77([77|R]) :- r78(R).
  316. r76([76|R]) :- r77(R).
  317. r75([75|R]) :- r76(R).
  318. r74([74|R]) :- r75(R).
  319. r73([73|R]) :- r74(R).
  320. r72([72|R]) :- r73(R).
  321. r71([71|R]) :- r72(R).
  322. r70([70|R]) :- r71(R).
  323. r69([69|R]) :- r70(R).
  324. r68([68|R]) :- r69(R).
  325. r67([67|R]) :- r68(R).
  326. r66([66|R]) :- r67(R).
  327. r65([65|R]) :- r66(R).
  328. r64([64|R]) :- r65(R).
  329. r63([63|R]) :- r64(R).
  330. r62([62|R]) :- r63(R).
  331. r61([61|R]) :- r62(R).
  332. r60([60|R]) :- r61(R).
  333. r59([59|R]) :- r60(R).
  334. r58([58|R]) :- r59(R).
  335. r57([57|R]) :- r58(R).
  336. r56([56|R]) :- r57(R).
  337. r55([55|R]) :- r56(R).
  338. r54([54|R]) :- r55(R).
  339. r53([53|R]) :- r54(R).
  340. r52([52|R]) :- r53(R).
  341. r51([51|R]) :- r52(R).
  342. r50([50|R]) :- r51(R).
  343. r49([49|R]) :- r50(R).
  344. r48([48|R]) :- r49(R).
  345. r47([47|R]) :- r48(R).
  346. r46([46|R]) :- r47(R).
  347. r45([45|R]) :- r46(R).
  348. r44([44|R]) :- r45(R).
  349. r43([43|R]) :- r44(R).
  350. r42([42|R]) :- r43(R).
  351. r41([41|R]) :- r42(R).
  352. r40([40|R]) :- r41(R).
  353. r39([39|R]) :- r40(R).
  354. r38([38|R]) :- r39(R).
  355. r37([37|R]) :- r38(R).
  356. r36([36|R]) :- r37(R).
  357. r35([35|R]) :- r36(R).
  358. r34([34|R]) :- r35(R).
  359. r33([33|R]) :- r34(R).
  360. r32([32|R]) :- r33(R).
  361. r31([31|R]) :- r32(R).
  362. r30([30|R]) :- r31(R).
  363. r29([29|R]) :- r30(R).
  364. r28([28|R]) :- r29(R).
  365. r27([27|R]) :- r28(R).
  366. r26([26|R]) :- r27(R).
  367. r25([25|R]) :- r26(R).
  368. r24([24|R]) :- r25(R).
  369. r23([23|R]) :- r24(R).
  370. r22([22|R]) :- r23(R).
  371. r21([21|R]) :- r22(R).
  372. r20([20|R]) :- r21(R).
  373. r19([19|R]) :- r20(R).
  374. r18([18|R]) :- r19(R).
  375. r17([17|R]) :- r18(R).
  376. r16([16|R]) :- r17(R).
  377. r15([15|R]) :- r16(R).
  378. r14([14|R]) :- r15(R).
  379. r13([13|R]) :- r14(R).
  380. r12([12|R]) :- r13(R).
  381. r11([11|R]) :- r12(R).
  382. r10([10|R]) :- r11(R).
  383. r9([9|R]) :- r10(R).
  384. r8([8|R]) :- r9(R).
  385. r7([7|R]) :- r8(R).
  386. r6([6|R]) :- r7(R).
  387. r5([5|R]) :- r6(R).
  388. r4([4|R]) :- r5(R).
  389. r3([3|R]) :- r4(R).
  390. r2([2|R]) :- r3(R).
  391. r1([1|R]) :- r2(R).
  392.  
  393. % 7. Construct a term with 100 nodes, nonrecursively
  394.  
  395. % 8. Walk down a term with 100 nodes, nonrecursively.
  396.  
  397. % 9. Walk down a term with 100 nodes, recursively.
  398.  
  399. wtr(nil).
  400. wtr(f(_,R)) :- wtr(R).
  401.  
  402. % Nonrecursive term cruncher
  403.  
  404. s101(nil).
  405. s100(f(100, R)) :- s101(R).
  406. s99(f(99, R)) :- s100(R).
  407. s98(f(98, R)) :- s99(R).
  408. s97(f(97, R)) :- s98(R).
  409. s96(f(96, R)) :- s97(R).
  410. s95(f(95, R)) :- s96(R).
  411. s94(f(94, R)) :- s95(R).
  412. s93(f(93, R)) :- s94(R).
  413. s92(f(92, R)) :- s93(R).
  414. s91(f(91, R)) :- s92(R).
  415. s90(f(90, R)) :- s91(R).
  416. s89(f(89, R)) :- s90(R).
  417. s88(f(88, R)) :- s89(R).
  418. s87(f(87, R)) :- s88(R).
  419. s86(f(86, R)) :- s87(R).
  420. s85(f(85, R)) :- s86(R).
  421. s84(f(84, R)) :- s85(R).
  422. s83(f(83, R)) :- s84(R).
  423. s82(f(82, R)) :- s83(R).
  424. s81(f(81, R)) :- s82(R).
  425. s80(f(80, R)) :- s81(R).
  426. s79(f(79, R)) :- s80(R).
  427. s78(f(78, R)) :- s79(R).
  428. s77(f(77, R)) :- s78(R).
  429. s76(f(76, R)) :- s77(R).
  430. s75(f(75, R)) :- s76(R).
  431. s74(f(74, R)) :- s75(R).
  432. s73(f(73, R)) :- s74(R).
  433. s72(f(72, R)) :- s73(R).
  434. s71(f(71, R)) :- s72(R).
  435. s70(f(70, R)) :- s71(R).
  436. s69(f(69, R)) :- s70(R).
  437. s68(f(68, R)) :- s69(R).
  438. s67(f(67, R)) :- s68(R).
  439. s66(f(66, R)) :- s67(R).
  440. s65(f(65, R)) :- s66(R).
  441. s64(f(64, R)) :- s65(R).
  442. s63(f(63, R)) :- s64(R).
  443. s62(f(62, R)) :- s63(R).
  444. s61(f(61, R)) :- s62(R).
  445. s60(f(60, R)) :- s61(R).
  446. s59(f(59, R)) :- s60(R).
  447. s58(f(58, R)) :- s59(R).
  448. s57(f(57, R)) :- s58(R).
  449. s56(f(56, R)) :- s57(R).
  450. s55(f(55, R)) :- s56(R).
  451. s54(f(54, R)) :- s55(R).
  452. s53(f(53, R)) :- s54(R).
  453. s52(f(52, R)) :- s53(R).
  454. s51(f(51, R)) :- s52(R).
  455. s50(f(50, R)) :- s51(R).
  456. s49(f(49, R)) :- s50(R).
  457. s48(f(48, R)) :- s49(R).
  458. s47(f(47, R)) :- s48(R).
  459. s46(f(46, R)) :- s47(R).
  460. s45(f(45, R)) :- s46(R).
  461. s44(f(44, R)) :- s45(R).
  462. s43(f(43, R)) :- s44(R).
  463. s42(f(42, R)) :- s43(R).
  464. s41(f(41, R)) :- s42(R).
  465. s40(f(40, R)) :- s41(R).
  466. s39(f(39, R)) :- s40(R).
  467. s38(f(38, R)) :- s39(R).
  468. s37(f(37, R)) :- s38(R).
  469. s36(f(36, R)) :- s37(R).
  470. s35(f(35, R)) :- s36(R).
  471. s34(f(34, R)) :- s35(R).
  472. s33(f(33, R)) :- s34(R).
  473. s32(f(32, R)) :- s33(R).
  474. s31(f(31, R)) :- s32(R).
  475. s30(f(30, R)) :- s31(R).
  476. s29(f(29, R)) :- s30(R).
  477. s28(f(28, R)) :- s29(R).
  478. s27(f(27, R)) :- s28(R).
  479. s26(f(26, R)) :- s27(R).
  480. s25(f(25, R)) :- s26(R).
  481. s24(f(24, R)) :- s25(R).
  482. s23(f(23, R)) :- s24(R).
  483. s22(f(22, R)) :- s23(R).
  484. s21(f(21, R)) :- s22(R).
  485. s20(f(20, R)) :- s21(R).
  486. s19(f(19, R)) :- s20(R).
  487. s18(f(18, R)) :- s19(R).
  488. s17(f(17, R)) :- s18(R).
  489. s16(f(16, R)) :- s17(R).
  490. s15(f(15, R)) :- s16(R).
  491. s14(f(14, R)) :- s15(R).
  492. s13(f(13, R)) :- s14(R).
  493. s12(f(12, R)) :- s13(R).
  494. s11(f(11, R)) :- s12(R).
  495. s10(f(10, R)) :- s11(R).
  496. s9(f(9, R)) :- s10(R).
  497. s8(f(8, R)) :- s9(R).
  498. s7(f(7, R)) :- s8(R).
  499. s6(f(6, R)) :- s7(R).
  500. s5(f(5, R)) :- s6(R).
  501. s4(f(4, R)) :- s5(R).
  502. s3(f(3, R)) :- s4(R).
  503. s2(f(2, R)) :- s3(R).
  504. s1(f(1, R)) :- s2(R).
  505.  
  506. % 10. 99 shallow failures; no assumption on indexing
  507.  
  508. b1(_X, _Y) :- fail.
  509. b1(_X, _Y) :- fail.
  510. b1(_X, _Y) :- fail.
  511. b1(_X, _Y) :- fail.
  512. b1(_X, _Y) :- fail.
  513. b1(_X, _Y) :- fail.
  514. b1(_X, _Y) :- fail.
  515. b1(_X, _Y) :- fail.
  516. b1(_X, _Y) :- fail.
  517. b1(_X, _Y) :- fail.
  518. b1(_X, _Y) :- fail.
  519. b1(_X, _Y) :- fail.
  520. b1(_X, _Y) :- fail.
  521. b1(_X, _Y) :- fail.
  522. b1(_X, _Y) :- fail.
  523. b1(_X, _Y) :- fail.
  524. b1(_X, _Y) :- fail.
  525. b1(_X, _Y) :- fail.
  526. b1(_X, _Y) :- fail.
  527. b1(_X, _Y) :- fail.
  528. b1(_X, _Y) :- fail.
  529. b1(_X, _Y) :- fail.
  530. b1(_X, _Y) :- fail.
  531. b1(_X, _Y) :- fail.
  532. b1(_X, _Y) :- fail.
  533. b1(_X, _Y) :- fail.
  534. b1(_X, _Y) :- fail.
  535. b1(_X, _Y) :- fail.
  536. b1(_X, _Y) :- fail.
  537. b1(_X, _Y) :- fail.
  538. b1(_X, _Y) :- fail.
  539. b1(_X, _Y) :- fail.
  540. b1(_X, _Y) :- fail.
  541. b1(_X, _Y) :- fail.
  542. b1(_X, _Y) :- fail.
  543. b1(_X, _Y) :- fail.
  544. b1(_X, _Y) :- fail.
  545. b1(_X, _Y) :- fail.
  546. b1(_X, _Y) :- fail.
  547. b1(_X, _Y) :- fail.
  548. b1(_X, _Y) :- fail.
  549. b1(_X, _Y) :- fail.
  550. b1(_X, _Y) :- fail.
  551. b1(_X, _Y) :- fail.
  552. b1(_X, _Y) :- fail.
  553. b1(_X, _Y) :- fail.
  554. b1(_X, _Y) :- fail.
  555. b1(_X, _Y) :- fail.
  556. b1(_X, _Y) :- fail.
  557. b1(_X, _Y) :- fail.
  558. b1(_X, _Y) :- fail.
  559. b1(_X, _Y) :- fail.
  560. b1(_X, _Y) :- fail.
  561. b1(_X, _Y) :- fail.
  562. b1(_X, _Y) :- fail.
  563. b1(_X, _Y) :- fail.
  564. b1(_X, _Y) :- fail.
  565. b1(_X, _Y) :- fail.
  566. b1(_X, _Y) :- fail.
  567. b1(_X, _Y) :- fail.
  568. b1(_X, _Y) :- fail.
  569. b1(_X, _Y) :- fail.
  570. b1(_X, _Y) :- fail.
  571. b1(_X, _Y) :- fail.
  572. b1(_X, _Y) :- fail.
  573. b1(_X, _Y) :- fail.
  574. b1(_X, _Y) :- fail.
  575. b1(_X, _Y) :- fail.
  576. b1(_X, _Y) :- fail.
  577. b1(_X, _Y) :- fail.
  578. b1(_X, _Y) :- fail.
  579. b1(_X, _Y) :- fail.
  580. b1(_X, _Y) :- fail.
  581. b1(_X, _Y) :- fail.
  582. b1(_X, _Y) :- fail.
  583. b1(_X, _Y) :- fail.
  584. b1(_X, _Y) :- fail.
  585. b1(_X, _Y) :- fail.
  586. b1(_X, _Y) :- fail.
  587. b1(_X, _Y) :- fail.
  588. b1(_X, _Y) :- fail.
  589. b1(_X, _Y) :- fail.
  590. b1(_X, _Y) :- fail.
  591. b1(_X, _Y) :- fail.
  592. b1(_X, _Y) :- fail.
  593. b1(_X, _Y) :- fail.
  594. b1(_X, _Y) :- fail.
  595. b1(_X, _Y) :- fail.
  596. b1(_X, _Y) :- fail.
  597. b1(_X, _Y) :- fail.
  598. b1(_X, _Y) :- fail.
  599. b1(_X, _Y) :- fail.
  600. b1(_X, _Y) :- fail.
  601. b1(_X, _Y) :- fail.
  602. b1(_X, _Y) :- fail.
  603. b1(_X, _Y) :- fail.
  604. b1(_X, _Y) :- fail.
  605. b1(_X, _Y) :- fail.
  606. b1(_X, _Y) :- fail.
  607. b1(_X, 100).
  608.  
  609. shallow :- b1(_X, 100).    % initially b(_X, 100) and assumption of no indexing
  610.             % on second argument
  611.  
  612. % 11. 99 deep failures; assumes no indexing on 2nd argument
  613.  
  614. b(_X, 1).
  615. b(_X, 2).
  616. b(_X, 3).
  617. b(_X, 4).
  618. b(_X, 5).
  619. b(_X, 6).
  620. b(_X, 7).
  621. b(_X, 8).
  622. b(_X, 9).
  623. b(_X, 10).
  624. b(_X, 11).
  625. b(_X, 12).
  626. b(_X, 13).
  627. b(_X, 14).
  628. b(_X, 15).
  629. b(_X, 16).
  630. b(_X, 17).
  631. b(_X, 18).
  632. b(_X, 19).
  633. b(_X, 20).
  634. b(_X, 21).
  635. b(_X, 22).
  636. b(_X, 23).
  637. b(_X, 24).
  638. b(_X, 25).
  639. b(_X, 26).
  640. b(_X, 27).
  641. b(_X, 28).
  642. b(_X, 29).
  643. b(_X, 30).
  644. b(_X, 31).
  645. b(_X, 32).
  646. b(_X, 33).
  647. b(_X, 34).
  648. b(_X, 35).
  649. b(_X, 36).
  650. b(_X, 37).
  651. b(_X, 38).
  652. b(_X, 39).
  653. b(_X, 40).
  654. b(_X, 41).
  655. b(_X, 42).
  656. b(_X, 43).
  657. b(_X, 44).
  658. b(_X, 45).
  659. b(_X, 46).
  660. b(_X, 47).
  661. b(_X, 48).
  662. b(_X, 49).
  663. b(_X, 50).
  664. b(_X, 51).
  665. b(_X, 52).
  666. b(_X, 53).
  667. b(_X, 54).
  668. b(_X, 55).
  669. b(_X, 56).
  670. b(_X, 57).
  671. b(_X, 58).
  672. b(_X, 59).
  673. b(_X, 60).
  674. b(_X, 61).
  675. b(_X, 62).
  676. b(_X, 63).
  677. b(_X, 64).
  678. b(_X, 65).
  679. b(_X, 66).
  680. b(_X, 67).
  681. b(_X, 68).
  682. b(_X, 69).
  683. b(_X, 70).
  684. b(_X, 71).
  685. b(_X, 72).
  686. b(_X, 73).
  687. b(_X, 74).
  688. b(_X, 75).
  689. b(_X, 76).
  690. b(_X, 77).
  691. b(_X, 78).
  692. b(_X, 79).
  693. b(_X, 80).
  694. b(_X, 81).
  695. b(_X, 82).
  696. b(_X, 83).
  697. b(_X, 84).
  698. b(_X, 85).
  699. b(_X, 86).
  700. b(_X, 87).
  701. b(_X, 88).
  702. b(_X, 89).
  703. b(_X, 90).
  704. b(_X, 91).
  705. b(_X, 92).
  706. b(_X, 93).
  707. b(_X, 94).
  708. b(_X, 95).
  709. b(_X, 96).
  710. b(_X, 97).
  711. b(_X, 98).
  712. b(_X, 99).
  713. b(_X, 100).
  714.  
  715. deep :- b(_X, Y), Y = 100.
  716.  
  717. % 12. Push 100 choice points
  718. % Assumes no super-clever (multipredicate) optimizer
  719.  
  720. c100(a).
  721. c100(a).
  722. c99(a).
  723. c99(a) :- c100(a).
  724. c98(a).
  725. c98(a) :- c99(a).
  726. c97(a).
  727. c97(a) :- c98(a).
  728. c96(a).
  729. c96(a) :- c97(a).
  730. c95(a).
  731. c95(a) :- c96(a).
  732. c94(a).
  733. c94(a) :- c95(a).
  734. c93(a).
  735. c93(a) :- c94(a).
  736. c92(a).
  737. c92(a) :- c93(a).
  738. c91(a).
  739. c91(a) :- c92(a).
  740. c90(a).
  741. c90(a) :- c91(a).
  742. c89(a).
  743. c89(a) :- c90(a).
  744. c88(a).
  745. c88(a) :- c89(a).
  746. c87(a).
  747. c87(a) :- c88(a).
  748. c86(a).
  749. c86(a) :- c87(a).
  750. c85(a).
  751. c85(a) :- c86(a).
  752. c84(a).
  753. c84(a) :- c85(a).
  754. c83(a).
  755. c83(a) :- c84(a).
  756. c82(a).
  757. c82(a) :- c83(a).
  758. c81(a).
  759. c81(a) :- c82(a).
  760. c80(a).
  761. c80(a) :- c81(a).
  762. c79(a).
  763. c79(a) :- c80(a).
  764. c78(a).
  765. c78(a) :- c79(a).
  766. c77(a).
  767. c77(a) :- c78(a).
  768. c76(a).
  769. c76(a) :- c77(a).
  770.  
  771. c75(a).
  772. c75(a) :- c76(a).
  773. c74(a).
  774. c74(a) :- c75(a).
  775. c73(a).
  776. c73(a) :- c74(a).
  777. c72(a).
  778. c72(a) :- c73(a).
  779. c71(a).
  780. c71(a) :- c72(a).
  781. c70(a).
  782. c70(a) :- c71(a).
  783. c69(a).
  784. c69(a) :- c70(a).
  785. c68(a).
  786. c68(a) :- c69(a).
  787. c67(a).
  788. c67(a) :- c68(a).
  789. c66(a).
  790. c66(a) :- c67(a).
  791. c65(a).
  792. c65(a) :- c66(a).
  793. c64(a).
  794. c64(a) :- c65(a).
  795. c63(a).
  796. c63(a) :- c64(a).
  797. c62(a).
  798. c62(a) :- c63(a).
  799. c61(a).
  800. c61(a) :- c62(a).
  801. c60(a).
  802. c60(a) :- c61(a).
  803. c59(a).
  804. c59(a) :- c60(a).
  805. c58(a).
  806. c58(a) :- c59(a).
  807. c57(a).
  808. c57(a) :- c58(a).
  809. c56(a).
  810. c56(a) :- c57(a).
  811. c55(a).
  812. c55(a) :- c56(a).
  813. c54(a).
  814. c54(a) :- c55(a).
  815. c53(a).
  816. c53(a) :- c54(a).
  817. c52(a).
  818. c52(a) :- c53(a).
  819. c51(a).
  820. c51(a) :- c52(a).
  821. c50(a).
  822. c50(a) :- c51(a).
  823. c49(a).
  824. c49(a) :- c50(a).
  825. c48(a).
  826. c48(a) :- c49(a).
  827. c47(a).
  828. c47(a) :- c48(a).
  829. c46(a).
  830. c46(a) :- c47(a).
  831. c45(a).
  832. c45(a) :- c46(a).
  833. c44(a).
  834. c44(a) :- c45(a).
  835. c43(a).
  836. c43(a) :- c44(a).
  837. c42(a).
  838. c42(a) :- c43(a).
  839. c41(a).
  840. c41(a) :- c42(a).
  841. c40(a).
  842. c40(a) :- c41(a).
  843.  
  844.  
  845. c39(a).
  846. c39(a) :- c40(a).
  847. c38(a).
  848. c38(a) :- c39(a).
  849. c37(a).
  850. c37(a) :- c38(a).
  851. c36(a).
  852. c36(a) :- c37(a).
  853. c35(a).
  854. c35(a) :- c36(a).
  855. c34(a).
  856. c34(a) :- c35(a).
  857. c33(a).
  858. c33(a) :- c34(a).
  859. c32(a).
  860. c32(a) :- c33(a).
  861. c31(a).
  862. c31(a) :- c32(a).
  863. c30(a).
  864. c30(a) :- c31(a).
  865. c29(a).
  866. c29(a) :- c30(a).
  867. c28(a).
  868. c28(a) :- c29(a).
  869. c27(a).
  870. c27(a) :- c28(a).
  871. c26(a).
  872. c26(a) :- c27(a).
  873. c25(a).
  874. c25(a) :- c26(a).
  875. c24(a).
  876. c24(a) :- c25(a).
  877. c23(a).
  878. c23(a) :- c24(a).
  879. c22(a).
  880. c22(a) :- c23(a).
  881. c21(a).
  882. c21(a) :- c22(a).
  883. c20(a).
  884. c20(a) :- c21(a).
  885. c19(a).
  886. c19(a) :- c20(a).
  887. c18(a).
  888. c18(a) :- c19(a).
  889. c17(a).
  890. c17(a) :- c18(a).
  891. c16(a).
  892. c16(a) :- c17(a).
  893. c15(a).
  894. c15(a) :- c16(a).
  895. c14(a).
  896. c14(a) :- c15(a).
  897. c13(a).
  898. c13(a) :- c14(a).
  899. c12(a).
  900. c12(a) :- c13(a).
  901. c11(a).
  902. c11(a) :- c12(a).
  903. c10(a).
  904. c10(a) :- c11(a).
  905. c9(a).
  906. c9(a) :- c10(a).
  907. c8(a).
  908. c8(a) :- c9(a).
  909. c7(a).
  910. c7(a) :- c8(a).
  911. c6(a).
  912. c6(a) :- c7(a).
  913. c5(a).
  914. c5(a) :- c6(a).
  915. c4(a).
  916. c4(a) :- c5(a).
  917. c3(a).
  918. c3(a) :- c4(a).
  919. c2(a).
  920. c2(a) :- c3(a).
  921. c1(a).
  922. c1(a) :- c2(a).
  923.  
  924. choice :- c1(a), !.
  925.  
  926. % 13. Create 100 choice points and trail 100 variables
  927.  
  928. trail :- t1(_X), !.
  929.  
  930. t100(b).
  931. t100(a).
  932. t99(b).
  933. t99(a) :- t100(_X).
  934. t98(b).
  935. t98(a) :- t99(_X).
  936. t97(b).
  937. t97(a) :- t98(_X).
  938. t96(b).
  939. t96(a) :- t97(_X).
  940. t95(b).
  941. t95(a) :- t96(_X).
  942. t94(b).
  943. t94(a) :- t95(_X).
  944. t93(b).
  945. t93(a) :- t94(_X).
  946. t92(b).
  947. t92(a) :- t93(_X).
  948. t91(b).
  949. t91(a) :- t92(_X).
  950. t90(b).
  951. t90(a) :- t91(_X).
  952. t89(b).
  953. t89(a) :- t90(_X).
  954. t88(b).
  955. t88(a) :- t89(_X).
  956. t87(b).
  957. t87(a) :- t88(_X).
  958. t86(b).
  959. t86(a) :- t87(_X).
  960. t85(b).
  961. t85(a) :- t86(_X).
  962. t84(b).
  963. t84(a) :- t85(_X).
  964. t83(b).
  965. t83(a) :- t84(_X).
  966. t82(b).
  967. t82(a) :- t83(_X).
  968. t81(b).
  969. t81(a) :- t82(_X).
  970. t80(b).
  971. t80(a) :- t81(_X).
  972. t79(b).
  973. t79(a) :- t80(_X).
  974. t78(b).
  975. t78(a) :- t79(_X).
  976. t77(b).
  977. t77(a) :- t78(_X).
  978. t76(b).
  979. t76(a) :- t77(_X).
  980. t75(b).
  981. t75(a) :- t76(_X).
  982. t74(b).
  983. t74(a) :- t75(_X).
  984. t73(b).
  985. t73(a) :- t74(_X).
  986. t72(b).
  987. t72(a) :- t73(_X).
  988. t71(b).
  989. t71(a) :- t72(_X).
  990. t70(b).
  991. t70(a) :- t71(_X).
  992. t69(b).
  993. t69(a) :- t70(_X).
  994. t68(b).
  995. t68(a) :- t69(_X).
  996. t67(b).
  997. t67(a) :- t68(_X).
  998. t66(b).
  999. t66(a) :- t67(_X).
  1000. t65(b).
  1001. t65(a) :- t66(_X).
  1002. t64(b).
  1003. t64(a) :- t65(_X).
  1004. t63(b).
  1005. t63(a) :- t64(_X).
  1006. t62(b).
  1007. t62(a) :- t63(_X).
  1008. t61(b).
  1009. t61(a) :- t62(_X).
  1010. t60(b).
  1011. t60(a) :- t61(_X).
  1012. t59(b).
  1013. t59(a) :- t60(_X).
  1014. t58(b).
  1015. t58(a) :- t59(_X).
  1016. t57(b).
  1017. t57(a) :- t58(_X).
  1018. t56(b).
  1019. t56(a) :- t57(_X).
  1020. t55(b).
  1021. t55(a) :- t56(_X).
  1022. t54(b).
  1023. t54(a) :- t55(_X).
  1024. t53(b).
  1025. t53(a) :- t54(_X).
  1026. t52(b).
  1027. t52(a) :- t53(_X).
  1028. t51(b).
  1029. t51(a) :- t52(_X).
  1030. t50(b).
  1031. t50(a) :- t51(_X).
  1032. t49(b).
  1033. t49(a) :- t50(_X).
  1034. t48(b).
  1035. t48(a) :- t49(_X).
  1036. t47(b).
  1037. t47(a) :- t48(_X).
  1038. t46(b).
  1039. t46(a) :- t47(_X).
  1040. t45(b).
  1041. t45(a) :- t46(_X).
  1042. t44(b).
  1043. t44(a) :- t45(_X).
  1044. t43(b).
  1045. t43(a) :- t44(_X).
  1046. t42(b).
  1047. t42(a) :- t43(_X).
  1048. t41(b).
  1049. t41(a) :- t42(_X).
  1050. t40(b).
  1051. t40(a) :- t41(_X).
  1052. t39(b).
  1053. t39(a) :- t40(_X).
  1054. t38(b).
  1055. t38(a) :- t39(_X).
  1056. t37(b).
  1057. t37(a) :- t38(_X).
  1058. t36(b).
  1059. t36(a) :- t37(_X).
  1060. t35(b).
  1061. t35(a) :- t36(_X).
  1062. t34(b).
  1063. t34(a) :- t35(_X).
  1064. t33(b).
  1065. t33(a) :- t34(_X).
  1066. t32(b).
  1067. t32(a) :- t33(_X).
  1068. t31(b).
  1069. t31(a) :- t32(_X).
  1070. t30(b).
  1071. t30(a) :- t31(_X).
  1072. t29(b).
  1073. t29(a) :- t30(_X).
  1074. t28(b).
  1075. t28(a) :- t29(_X).
  1076. t27(b).
  1077. t27(a) :- t28(_X).
  1078. t26(b).
  1079. t26(a) :- t27(_X).
  1080. t25(b).
  1081. t25(a) :- t26(_X).
  1082. t24(b).
  1083. t24(a) :- t25(_X).
  1084. t23(b).
  1085. t23(a) :- t24(_X).
  1086. t22(b).
  1087. t22(a) :- t23(_X).
  1088. t21(b).
  1089. t21(a) :- t22(_X).
  1090. t20(b).
  1091. t20(a) :- t21(_X).
  1092. t19(b).
  1093. t19(a) :- t20(_X).
  1094. t18(b).
  1095. t18(a) :- t19(_X).
  1096. t17(b).
  1097. t17(a) :- t18(_X).
  1098. t16(b).
  1099. t16(a) :- t17(_X).
  1100. t15(b).
  1101. t15(a) :- t16(_X).
  1102. t14(b).
  1103. t14(a) :- t15(_X).
  1104. t13(b).
  1105. t13(a) :- t14(_X).
  1106. t12(b).
  1107. t12(a) :- t13(_X).
  1108. t11(b).
  1109. t11(a) :- t12(_X).
  1110. t10(b).
  1111. t10(a) :- t11(_X).
  1112. t9(b).
  1113. t9(a) :- t10(_X).
  1114. t8(b).
  1115. t8(a) :- t9(_X).
  1116. t7(b).
  1117. t7(a) :- t8(_X).
  1118. t6(b).
  1119. t6(a) :- t7(_X).
  1120. t5(b).
  1121. t5(a) :- t6(_X).
  1122. t4(b).
  1123. t4(a) :- t5(_X).
  1124. t3(b).
  1125. t3(a) :- t4(_X).
  1126. t2(b).
  1127. t2(a) :- t3(_X).
  1128. t1(a) :- t2(_X).
  1129. t1(b).
  1130.  
  1131. % 14. Unify terms that are small in space but textually large.
  1132.  
  1133. equal(X, X).
  1134.  
  1135. term64(X1) :-
  1136.    X1 = f(X2, X2),
  1137.    X2 = f(X4, X4),
  1138.    X4 = f(X8, X8),
  1139.    X8 = f(X16, X16),
  1140.    X16 = f(X32, X32),
  1141.    X32 = f(X64, X64).
  1142.  
  1143. term4096(X1) :-
  1144.    X1 = f(X2, X2),
  1145.    X2 = f(X4, X4),
  1146.    X4 = f(X8, X8),
  1147.    X8 = f(X16, X16),
  1148.    X16 = f(X32, X32),
  1149.    X32 = f(X64, X64),
  1150.    X64 = f(X128, X128),
  1151.    X128 = f(X256, X256),
  1152.    X256 = f(X512, X512),
  1153.    X512 = f(X1024, X1024),
  1154.    X1024 = f(X2048, X2048),
  1155.    X2048 = f(X4096, X4096).
  1156.  
  1157. % 15. Do 100 integer additions nonrecursively,
  1158. % avoiding obvious compiler optimizations.
  1159.  
  1160. a100(M, K, P) :- P is M + K.
  1161. a99(M, K, P) :- N is M + K, a100(N, 100, P).
  1162. a98(M, K, P) :- N is M + K, a99(N, 99, P).
  1163. a97(M, K, P) :- N is M + K, a98(N, 98, P).
  1164. a96(M, K, P) :- N is M + K, a97(N, 97, P).
  1165. a95(M, K, P) :- N is M + K, a96(N, 96, P).
  1166. a94(M, K, P) :- N is M + K, a95(N, 95, P).
  1167. a93(M, K, P) :- N is M + K, a94(N, 94, P).
  1168. a92(M, K, P) :- N is M + K, a93(N, 93, P).
  1169. a91(M, K, P) :- N is M + K, a92(N, 92, P).
  1170. a90(M, K, P) :- N is M + K, a91(N, 91, P).
  1171. a89(M, K, P) :- N is M + K, a90(N, 90, P).
  1172. a88(M, K, P) :- N is M + K, a89(N, 89, P).
  1173. a87(M, K, P) :- N is M + K, a88(N, 88, P).
  1174. a86(M, K, P) :- N is M + K, a87(N, 87, P).
  1175. a85(M, K, P) :- N is M + K, a86(N, 86, P).
  1176. a84(M, K, P) :- N is M + K, a85(N, 85, P).
  1177. a83(M, K, P) :- N is M + K, a84(N, 84, P).
  1178. a82(M, K, P) :- N is M + K, a83(N, 83, P).
  1179. a81(M, K, P) :- N is M + K, a82(N, 82, P).
  1180. a80(M, K, P) :- N is M + K, a81(N, 81, P).
  1181. a79(M, K, P) :- N is M + K, a80(N, 80, P).
  1182. a78(M, K, P) :- N is M + K, a79(N, 79, P).
  1183. a77(M, K, P) :- N is M + K, a78(N, 78, P).
  1184. a76(M, K, P) :- N is M + K, a77(N, 77, P).
  1185. a75(M, K, P) :- N is M + K, a76(N, 76, P).
  1186. a74(M, K, P) :- N is M + K, a75(N, 75, P).
  1187. a73(M, K, P) :- N is M + K, a74(N, 74, P).
  1188. a72(M, K, P) :- N is M + K, a73(N, 73, P).
  1189. a71(M, K, P) :- N is M + K, a72(N, 72, P).
  1190. a70(M, K, P) :- N is M + K, a71(N, 71, P).
  1191. a69(M, K, P) :- N is M + K, a70(N, 70, P).
  1192. a68(M, K, P) :- N is M + K, a69(N, 69, P).
  1193. a67(M, K, P) :- N is M + K, a68(N, 68, P).
  1194. a66(M, K, P) :- N is M + K, a67(N, 67, P).
  1195. a65(M, K, P) :- N is M + K, a66(N, 66, P).
  1196. a64(M, K, P) :- N is M + K, a65(N, 65, P).
  1197. a63(M, K, P) :- N is M + K, a64(N, 64, P).
  1198. a62(M, K, P) :- N is M + K, a63(N, 63, P).
  1199. a61(M, K, P) :- N is M + K, a62(N, 62, P).
  1200. a60(M, K, P) :- N is M + K, a61(N, 61, P).
  1201. a59(M, K, P) :- N is M + K, a60(N, 60, P).
  1202. a58(M, K, P) :- N is M + K, a59(N, 59, P).
  1203. a57(M, K, P) :- N is M + K, a58(N, 58, P).
  1204. a56(M, K, P) :- N is M + K, a57(N, 57, P).
  1205. a55(M, K, P) :- N is M + K, a56(N, 56, P).
  1206. a54(M, K, P) :- N is M + K, a55(N, 55, P).
  1207. a53(M, K, P) :- N is M + K, a54(N, 54, P).
  1208. a52(M, K, P) :- N is M + K, a53(N, 53, P).
  1209. a51(M, K, P) :- N is M + K, a52(N, 52, P).
  1210. a50(M, K, P) :- N is M + K, a51(N, 51, P).
  1211. a49(M, K, P) :- N is M + K, a50(N, 50, P).
  1212. a48(M, K, P) :- N is M + K, a49(N, 49, P).
  1213. a47(M, K, P) :- N is M + K, a48(N, 48, P).
  1214. a46(M, K, P) :- N is M + K, a47(N, 47, P).
  1215. a45(M, K, P) :- N is M + K, a46(N, 46, P).
  1216. a44(M, K, P) :- N is M + K, a45(N, 45, P).
  1217. a43(M, K, P) :- N is M + K, a44(N, 44, P).
  1218. a42(M, K, P) :- N is M + K, a43(N, 43, P).
  1219. a41(M, K, P) :- N is M + K, a42(N, 42, P).
  1220. a40(M, K, P) :- N is M + K, a41(N, 41, P).
  1221. a39(M, K, P) :- N is M + K, a40(N, 40, P).
  1222. a38(M, K, P) :- N is M + K, a39(N, 39, P).
  1223. a37(M, K, P) :- N is M + K, a38(N, 38, P).
  1224. a36(M, K, P) :- N is M + K, a37(N, 37, P).
  1225. a35(M, K, P) :- N is M + K, a36(N, 36, P).
  1226. a34(M, K, P) :- N is M + K, a35(N, 35, P).
  1227. a33(M, K, P) :- N is M + K, a34(N, 34, P).
  1228. a32(M, K, P) :- N is M + K, a33(N, 33, P).
  1229. a31(M, K, P) :- N is M + K, a32(N, 32, P).
  1230. a30(M, K, P) :- N is M + K, a31(N, 31, P).
  1231. a29(M, K, P) :- N is M + K, a30(N, 30, P).
  1232. a28(M, K, P) :- N is M + K, a29(N, 29, P).
  1233. a27(M, K, P) :- N is M + K, a28(N, 28, P).
  1234. a26(M, K, P) :- N is M + K, a27(N, 27, P).
  1235. a25(M, K, P) :- N is M + K, a26(N, 26, P).
  1236. a24(M, K, P) :- N is M + K, a25(N, 25, P).
  1237. a23(M, K, P) :- N is M + K, a24(N, 24, P).
  1238. a22(M, K, P) :- N is M + K, a23(N, 23, P).
  1239. a21(M, K, P) :- N is M + K, a22(N, 22, P).
  1240. a20(M, K, P) :- N is M + K, a21(N, 21, P).
  1241. a19(M, K, P) :- N is M + K, a20(N, 20, P).
  1242. a18(M, K, P) :- N is M + K, a19(N, 19, P).
  1243. a17(M, K, P) :- N is M + K, a18(N, 18, P).
  1244. a16(M, K, P) :- N is M + K, a17(N, 17, P).
  1245. a15(M, K, P) :- N is M + K, a16(N, 16, P).
  1246. a14(M, K, P) :- N is M + K, a15(N, 15, P).
  1247. a13(M, K, P) :- N is M + K, a14(N, 14, P).
  1248. a12(M, K, P) :- N is M + K, a13(N, 13, P).
  1249. a11(M, K, P) :- N is M + K, a12(N, 12, P).
  1250. a10(M, K, P) :- N is M + K, a11(N, 11, P).
  1251. a9(M, K, P) :- N is M + K, a10(N, 10, P).
  1252. a8(M, K, P) :- N is M + K, a9(N, 9, P).
  1253. a7(M, K, P) :- N is M + K, a8(N, 8, P).
  1254. a6(M, K, P) :- N is M + K, a7(N, 7, P).
  1255. a5(M, K, P) :- N is M + K, a6(N, 6, P).
  1256. a4(M, K, P) :- N is M + K, a5(N, 5, P).
  1257. a3(M, K, P) :- N is M + K, a4(N, 4, P).
  1258. a2(M, K, P) :- N is M + K, a3(N, 3, P).
  1259. a1(M, K, P) :- N is M + K, a2(N, 2, P).
  1260.  
  1261. % 16. 100 floating additions
  1262.  
  1263. fa100(M, K, P) :- P is M + K.
  1264. fa99(M, K, P) :- N is M + K, fa100(N, 100.1, P).
  1265. fa98(M, K, P) :- N is M + K, fa99(N, 99.1, P).
  1266. fa97(M, K, P) :- N is M + K, fa98(N, 98.1, P).
  1267. fa96(M, K, P) :- N is M + K, fa97(N, 97.1, P).
  1268. fa95(M, K, P) :- N is M + K, fa96(N, 96.1, P).
  1269. fa94(M, K, P) :- N is M + K, fa95(N, 95.1, P).
  1270. fa93(M, K, P) :- N is M + K, fa94(N, 94.1, P).
  1271. fa92(M, K, P) :- N is M + K, fa93(N, 93.1, P).
  1272. fa91(M, K, P) :- N is M + K, fa92(N, 92.1, P).
  1273. fa90(M, K, P) :- N is M + K, fa91(N, 91.1, P).
  1274. fa89(M, K, P) :- N is M + K, fa90(N, 90.1, P).
  1275. fa88(M, K, P) :- N is M + K, fa89(N, 89.1, P).
  1276. fa87(M, K, P) :- N is M + K, fa88(N, 88.1, P).
  1277. fa86(M, K, P) :- N is M + K, fa87(N, 87.1, P).
  1278. fa85(M, K, P) :- N is M + K, fa86(N, 86.1, P).
  1279. fa84(M, K, P) :- N is M + K, fa85(N, 85.1, P).
  1280. fa83(M, K, P) :- N is M + K, fa84(N, 84.1, P).
  1281. fa82(M, K, P) :- N is M + K, fa83(N, 83.1, P).
  1282. fa81(M, K, P) :- N is M + K, fa82(N, 82.1, P).
  1283. fa80(M, K, P) :- N is M + K, fa81(N, 81.1, P).
  1284. fa79(M, K, P) :- N is M + K, fa80(N, 80.1, P).
  1285. fa78(M, K, P) :- N is M + K, fa79(N, 79.1, P).
  1286. fa77(M, K, P) :- N is M + K, fa78(N, 78.1, P).
  1287. fa76(M, K, P) :- N is M + K, fa77(N, 77.1, P).
  1288. fa75(M, K, P) :- N is M + K, fa76(N, 76.1, P).
  1289. fa74(M, K, P) :- N is M + K, fa75(N, 75.1, P).
  1290. fa73(M, K, P) :- N is M + K, fa74(N, 74.1, P).
  1291. fa72(M, K, P) :- N is M + K, fa73(N, 73.1, P).
  1292. fa71(M, K, P) :- N is M + K, fa72(N, 72.1, P).
  1293. fa70(M, K, P) :- N is M + K, fa71(N, 71.1, P).
  1294. fa69(M, K, P) :- N is M + K, fa70(N, 70.1, P).
  1295. fa68(M, K, P) :- N is M + K, fa69(N, 69.1, P).
  1296. fa67(M, K, P) :- N is M + K, fa68(N, 68.1, P).
  1297. fa66(M, K, P) :- N is M + K, fa67(N, 67.1, P).
  1298. fa65(M, K, P) :- N is M + K, fa66(N, 66.1, P).
  1299. fa64(M, K, P) :- N is M + K, fa65(N, 65.1, P).
  1300. fa63(M, K, P) :- N is M + K, fa64(N, 64.1, P).
  1301. fa62(M, K, P) :- N is M + K, fa63(N, 63.1, P).
  1302. fa61(M, K, P) :- N is M + K, fa62(N, 62.1, P).
  1303. fa60(M, K, P) :- N is M + K, fa61(N, 61.1, P).
  1304. fa59(M, K, P) :- N is M + K, fa60(N, 60.1, P).
  1305. fa58(M, K, P) :- N is M + K, fa59(N, 59.1, P).
  1306. fa57(M, K, P) :- N is M + K, fa58(N, 58.1, P).
  1307. fa56(M, K, P) :- N is M + K, fa57(N, 57.1, P).
  1308. fa55(M, K, P) :- N is M + K, fa56(N, 56.1, P).
  1309. fa54(M, K, P) :- N is M + K, fa55(N, 55.1, P).
  1310. fa53(M, K, P) :- N is M + K, fa54(N, 54.1, P).
  1311. fa52(M, K, P) :- N is M + K, fa53(N, 53.1, P).
  1312. fa51(M, K, P) :- N is M + K, fa52(N, 52.1, P).
  1313. fa50(M, K, P) :- N is M + K, fa51(N, 51.1, P).
  1314. fa49(M, K, P) :- N is M + K, fa50(N, 50.1, P).
  1315. fa48(M, K, P) :- N is M + K, fa49(N, 49.1, P).
  1316. fa47(M, K, P) :- N is M + K, fa48(N, 48.1, P).
  1317. fa46(M, K, P) :- N is M + K, fa47(N, 47.1, P).
  1318. fa45(M, K, P) :- N is M + K, fa46(N, 46.1, P).
  1319. fa44(M, K, P) :- N is M + K, fa45(N, 45.1, P).
  1320. fa43(M, K, P) :- N is M + K, fa44(N, 44.1, P).
  1321. fa42(M, K, P) :- N is M + K, fa43(N, 43.1, P).
  1322. fa41(M, K, P) :- N is M + K, fa42(N, 42.1, P).
  1323. fa40(M, K, P) :- N is M + K, fa41(N, 41.1, P).
  1324. fa39(M, K, P) :- N is M + K, fa40(N, 40.1, P).
  1325. fa38(M, K, P) :- N is M + K, fa39(N, 39.1, P).
  1326. fa37(M, K, P) :- N is M + K, fa38(N, 38.1, P).
  1327. fa36(M, K, P) :- N is M + K, fa37(N, 37.1, P).
  1328. fa35(M, K, P) :- N is M + K, fa36(N, 36.1, P).
  1329. fa34(M, K, P) :- N is M + K, fa35(N, 35.1, P).
  1330. fa33(M, K, P) :- N is M + K, fa34(N, 34.1, P).
  1331. fa32(M, K, P) :- N is M + K, fa33(N, 33.1, P).
  1332. fa31(M, K, P) :- N is M + K, fa32(N, 32.1, P).
  1333. fa30(M, K, P) :- N is M + K, fa31(N, 31.1, P).
  1334. fa29(M, K, P) :- N is M + K, fa30(N, 30.1, P).
  1335. fa28(M, K, P) :- N is M + K, fa29(N, 29.1, P).
  1336. fa27(M, K, P) :- N is M + K, fa28(N, 28.1, P).
  1337. fa26(M, K, P) :- N is M + K, fa27(N, 27.1, P).
  1338. fa25(M, K, P) :- N is M + K, fa26(N, 26.1, P).
  1339. fa24(M, K, P) :- N is M + K, fa25(N, 25.1, P).
  1340. fa23(M, K, P) :- N is M + K, fa24(N, 24.1, P).
  1341. fa22(M, K, P) :- N is M + K, fa23(N, 23.1, P).
  1342. fa21(M, K, P) :- N is M + K, fa22(N, 22.1, P).
  1343. fa20(M, K, P) :- N is M + K, fa21(N, 21.1, P).
  1344. fa19(M, K, P) :- N is M + K, fa20(N, 20.1, P).
  1345. fa18(M, K, P) :- N is M + K, fa19(N, 19.1, P).
  1346. fa17(M, K, P) :- N is M + K, fa18(N, 18.1, P).
  1347. fa16(M, K, P) :- N is M + K, fa17(N, 17.1, P).
  1348. fa15(M, K, P) :- N is M + K, fa16(N, 16.1, P).
  1349. fa14(M, K, P) :- N is M + K, fa15(N, 15.1, P).
  1350. fa13(M, K, P) :- N is M + K, fa14(N, 14.1, P).
  1351. fa12(M, K, P) :- N is M + K, fa13(N, 13.1, P).
  1352. fa11(M, K, P) :- N is M + K, fa12(N, 12.1, P).
  1353. fa10(M, K, P) :- N is M + K, fa11(N, 11.1, P).
  1354. fa9(M, K, P) :- N is M + K, fa10(N, 10.1, P).
  1355. fa8(M, K, P) :- N is M + K, fa9(N, 9.1, P).
  1356. fa7(M, K, P) :- N is M + K, fa8(N, 8.1, P).
  1357. fa6(M, K, P) :- N is M + K, fa7(N, 7.1, P).
  1358. fa5(M, K, P) :- N is M + K, fa6(N, 6.1, P).
  1359. fa4(M, K, P) :- N is M + K, fa5(N, 5.1, P).
  1360. fa3(M, K, P) :- N is M + K, fa4(N, 4.1, P).
  1361. fa2(M, K, P) :- N is M + K, fa3(N, 3.1, P).
  1362. fa1(M, K, P) :- N is M + K, fa2(N, 2.1, P).
  1363.  
  1364. % 17. 100 calls to arg at position N
  1365.  
  1366. arg100(N, T, R) :- arg(N, T, R).
  1367. arg99(N, T, R) :- arg(N, T, X), arg100(N, X, R).
  1368. arg98(N, T, R) :- arg(N, T, X), arg99(N, X, R).
  1369. arg97(N, T, R) :- arg(N, T, X), arg98(N, X, R).
  1370. arg96(N, T, R) :- arg(N, T, X), arg97(N, X, R).
  1371. arg95(N, T, R) :- arg(N, T, X), arg96(N, X, R).
  1372. arg94(N, T, R) :- arg(N, T, X), arg95(N, X, R).
  1373. arg93(N, T, R) :- arg(N, T, X), arg94(N, X, R).
  1374. arg92(N, T, R) :- arg(N, T, X), arg93(N, X, R).
  1375. arg91(N, T, R) :- arg(N, T, X), arg92(N, X, R).
  1376. arg90(N, T, R) :- arg(N, T, X), arg91(N, X, R).
  1377. arg89(N, T, R) :- arg(N, T, X), arg90(N, X, R).
  1378. arg88(N, T, R) :- arg(N, T, X), arg89(N, X, R).
  1379. arg87(N, T, R) :- arg(N, T, X), arg88(N, X, R).
  1380. arg86(N, T, R) :- arg(N, T, X), arg87(N, X, R).
  1381. arg85(N, T, R) :- arg(N, T, X), arg86(N, X, R).
  1382. arg84(N, T, R) :- arg(N, T, X), arg85(N, X, R).
  1383. arg83(N, T, R) :- arg(N, T, X), arg84(N, X, R).
  1384. arg82(N, T, R) :- arg(N, T, X), arg83(N, X, R).
  1385. arg81(N, T, R) :- arg(N, T, X), arg82(N, X, R).
  1386. arg80(N, T, R) :- arg(N, T, X), arg81(N, X, R).
  1387. arg79(N, T, R) :- arg(N, T, X), arg80(N, X, R).
  1388. arg78(N, T, R) :- arg(N, T, X), arg79(N, X, R).
  1389. arg77(N, T, R) :- arg(N, T, X), arg78(N, X, R).
  1390. arg76(N, T, R) :- arg(N, T, X), arg77(N, X, R).
  1391. arg75(N, T, R) :- arg(N, T, X), arg76(N, X, R).
  1392. arg74(N, T, R) :- arg(N, T, X), arg75(N, X, R).
  1393. arg73(N, T, R) :- arg(N, T, X), arg74(N, X, R).
  1394. arg72(N, T, R) :- arg(N, T, X), arg73(N, X, R).
  1395. arg71(N, T, R) :- arg(N, T, X), arg72(N, X, R).
  1396. arg70(N, T, R) :- arg(N, T, X), arg71(N, X, R).
  1397. arg69(N, T, R) :- arg(N, T, X), arg70(N, X, R).
  1398. arg68(N, T, R) :- arg(N, T, X), arg69(N, X, R).
  1399. arg67(N, T, R) :- arg(N, T, X), arg68(N, X, R).
  1400. arg66(N, T, R) :- arg(N, T, X), arg67(N, X, R).
  1401. arg65(N, T, R) :- arg(N, T, X), arg66(N, X, R).
  1402. arg64(N, T, R) :- arg(N, T, X), arg65(N, X, R).
  1403. arg63(N, T, R) :- arg(N, T, X), arg64(N, X, R).
  1404. arg62(N, T, R) :- arg(N, T, X), arg63(N, X, R).
  1405. arg61(N, T, R) :- arg(N, T, X), arg62(N, X, R).
  1406. arg60(N, T, R) :- arg(N, T, X), arg61(N, X, R).
  1407. arg59(N, T, R) :- arg(N, T, X), arg60(N, X, R).
  1408. arg58(N, T, R) :- arg(N, T, X), arg59(N, X, R).
  1409. arg57(N, T, R) :- arg(N, T, X), arg58(N, X, R).
  1410. arg56(N, T, R) :- arg(N, T, X), arg57(N, X, R).
  1411. arg55(N, T, R) :- arg(N, T, X), arg56(N, X, R).
  1412. arg54(N, T, R) :- arg(N, T, X), arg55(N, X, R).
  1413. arg53(N, T, R) :- arg(N, T, X), arg54(N, X, R).
  1414. arg52(N, T, R) :- arg(N, T, X), arg53(N, X, R).
  1415. arg51(N, T, R) :- arg(N, T, X), arg52(N, X, R).
  1416. arg50(N, T, R) :- arg(N, T, X), arg51(N, X, R).
  1417. arg49(N, T, R) :- arg(N, T, X), arg50(N, X, R).
  1418. arg48(N, T, R) :- arg(N, T, X), arg49(N, X, R).
  1419. arg47(N, T, R) :- arg(N, T, X), arg48(N, X, R).
  1420. arg46(N, T, R) :- arg(N, T, X), arg47(N, X, R).
  1421. arg45(N, T, R) :- arg(N, T, X), arg46(N, X, R).
  1422. arg44(N, T, R) :- arg(N, T, X), arg45(N, X, R).
  1423. arg43(N, T, R) :- arg(N, T, X), arg44(N, X, R).
  1424. arg42(N, T, R) :- arg(N, T, X), arg43(N, X, R).
  1425. arg41(N, T, R) :- arg(N, T, X), arg42(N, X, R).
  1426. arg40(N, T, R) :- arg(N, T, X), arg41(N, X, R).
  1427. arg39(N, T, R) :- arg(N, T, X), arg40(N, X, R).
  1428. arg38(N, T, R) :- arg(N, T, X), arg39(N, X, R).
  1429. arg37(N, T, R) :- arg(N, T, X), arg38(N, X, R).
  1430. arg36(N, T, R) :- arg(N, T, X), arg37(N, X, R).
  1431. arg35(N, T, R) :- arg(N, T, X), arg36(N, X, R).
  1432. arg34(N, T, R) :- arg(N, T, X), arg35(N, X, R).
  1433. arg33(N, T, R) :- arg(N, T, X), arg34(N, X, R).
  1434. arg32(N, T, R) :- arg(N, T, X), arg33(N, X, R).
  1435. arg31(N, T, R) :- arg(N, T, X), arg32(N, X, R).
  1436. arg30(N, T, R) :- arg(N, T, X), arg31(N, X, R).
  1437. arg29(N, T, R) :- arg(N, T, X), arg30(N, X, R).
  1438. arg28(N, T, R) :- arg(N, T, X), arg29(N, X, R).
  1439. arg27(N, T, R) :- arg(N, T, X), arg28(N, X, R).
  1440. arg26(N, T, R) :- arg(N, T, X), arg27(N, X, R).
  1441. arg25(N, T, R) :- arg(N, T, X), arg26(N, X, R).
  1442. arg24(N, T, R) :- arg(N, T, X), arg25(N, X, R).
  1443. arg23(N, T, R) :- arg(N, T, X), arg24(N, X, R).
  1444. arg22(N, T, R) :- arg(N, T, X), arg23(N, X, R).
  1445. arg21(N, T, R) :- arg(N, T, X), arg22(N, X, R).
  1446. arg20(N, T, R) :- arg(N, T, X), arg21(N, X, R).
  1447. arg19(N, T, R) :- arg(N, T, X), arg20(N, X, R).
  1448. arg18(N, T, R) :- arg(N, T, X), arg19(N, X, R).
  1449. arg17(N, T, R) :- arg(N, T, X), arg18(N, X, R).
  1450. arg16(N, T, R) :- arg(N, T, X), arg17(N, X, R).
  1451. arg15(N, T, R) :- arg(N, T, X), arg16(N, X, R).
  1452. arg14(N, T, R) :- arg(N, T, X), arg15(N, X, R).
  1453. arg13(N, T, R) :- arg(N, T, X), arg14(N, X, R).
  1454. arg12(N, T, R) :- arg(N, T, X), arg13(N, X, R).
  1455. arg11(N, T, R) :- arg(N, T, X), arg12(N, X, R).
  1456. arg10(N, T, R) :- arg(N, T, X), arg11(N, X, R).
  1457. arg9(N, T, R) :- arg(N, T, X), arg10(N, X, R).
  1458. arg8(N, T, R) :- arg(N, T, X), arg9(N, X, R).
  1459. arg7(N, T, R) :- arg(N, T, X), arg8(N, X, R).
  1460. arg6(N, T, R) :- arg(N, T, X), arg7(N, X, R).
  1461. arg5(N, T, R) :- arg(N, T, X), arg6(N, X, R).
  1462. arg4(N, T, R) :- arg(N, T, X), arg5(N, X, R).
  1463. arg3(N, T, R) :- arg(N, T, X), arg4(N, X, R).
  1464. arg2(N, T, R) :- arg(N, T, X), arg3(N, X, R).
  1465. arg1(N, T, R) :- arg(N, T, X), arg2(N, X, R).
  1466.  
  1467. fill_nary_term(0, _, _) :- !.
  1468. fill_nary_term(N, SubTerm, Term) :-
  1469.    N > 0, M is N - 1,
  1470.    arg(N, Term, SubTerm),
  1471.    fill_nary_term(M, SubTerm, Term).
  1472.  
  1473. nary_term(N, SubTerm, Term) :-
  1474.    functor(Term, f, N),
  1475.    fill_nary_term(N, SubTerm, Term).
  1476.  
  1477. complex_nary_term(0, N, N) :- !.
  1478. complex_nary_term(I, N, Term) :-
  1479.    I > 0, J is I - 1,
  1480.    complex_nary_term(J, N, SubTerm),
  1481.    nary_term(N, SubTerm, Term).
  1482.  
  1483. % 18. 100 indexed calls; some systems may require extra declarations to
  1484. % put an index on the first argument.
  1485.  
  1486. ix(1) :- ix(10000).
  1487. ix(4).
  1488. ix(9) :- ix(4).
  1489. ix(16) :- ix(9).
  1490. ix(25) :- ix(16).
  1491. ix(36) :- ix(25).
  1492. ix(49) :- ix(36).
  1493. ix(64) :- ix(49).
  1494. ix(81) :- ix(64).
  1495. ix(100) :- ix(81).
  1496. ix(121) :- ix(100).
  1497. ix(144) :- ix(121).
  1498. ix(169) :- ix(144).
  1499. ix(196) :- ix(169).
  1500. ix(225) :- ix(196).
  1501. ix(256) :- ix(225).
  1502. ix(289) :- ix(256).
  1503. ix(324) :- ix(289).
  1504. ix(361) :- ix(324).
  1505. ix(400) :- ix(361).
  1506. ix(441) :- ix(400).
  1507. ix(484) :- ix(441).
  1508. ix(529) :- ix(484).
  1509. ix(576) :- ix(529).
  1510. ix(625) :- ix(576).
  1511. ix(676) :- ix(625).
  1512. ix(729) :- ix(676).
  1513. ix(784) :- ix(729).
  1514. ix(841) :- ix(784).
  1515. ix(900) :- ix(841).
  1516. ix(961) :- ix(900).
  1517. ix(1024) :- ix(961).
  1518. ix(1089) :- ix(1024).
  1519. ix(1156) :- ix(1089).
  1520. ix(1225) :- ix(1156).
  1521. ix(1296) :- ix(1225).
  1522. ix(1369) :- ix(1296).
  1523. ix(1444) :- ix(1369).
  1524. ix(1521) :- ix(1444).
  1525. ix(1600) :- ix(1521).
  1526. ix(1681) :- ix(1600).
  1527. ix(1764) :- ix(1681).
  1528. ix(1849) :- ix(1764).
  1529. ix(1936) :- ix(1849).
  1530. ix(2025) :- ix(1936).
  1531. ix(2116) :- ix(2025).
  1532. ix(2209) :- ix(2116).
  1533. ix(2304) :- ix(2209).
  1534. ix(2401) :- ix(2304).
  1535. ix(2500) :- ix(2401).
  1536. ix(2601) :- ix(2500).
  1537. ix(2704) :- ix(2601).
  1538. ix(2809) :- ix(2704).
  1539. ix(2916) :- ix(2809).
  1540. ix(3025) :- ix(2916).
  1541. ix(3136) :- ix(3025).
  1542. ix(3249) :- ix(3136).
  1543. ix(3364) :- ix(3249).
  1544. ix(3481) :- ix(3364).
  1545. ix(3600) :- ix(3481).
  1546. ix(3721) :- ix(3600).
  1547. ix(3844) :- ix(3721).
  1548. ix(3969) :- ix(3844).
  1549. ix(4096) :- ix(3969).
  1550. ix(4225) :- ix(4096).
  1551. ix(4356) :- ix(4225).
  1552. ix(4489) :- ix(4356).
  1553. ix(4624) :- ix(4489).
  1554. ix(4761) :- ix(4624).
  1555. ix(4900) :- ix(4761).
  1556. ix(5041) :- ix(4900).
  1557. ix(5184) :- ix(5041).
  1558. ix(5329) :- ix(5184).
  1559. ix(5476) :- ix(5329).
  1560. ix(5625) :- ix(5476).
  1561. ix(5776) :- ix(5625).
  1562. ix(5929) :- ix(5776).
  1563. ix(6084) :- ix(5929).
  1564. ix(6241) :- ix(6084).
  1565. ix(6400) :- ix(6241).
  1566. ix(6561) :- ix(6400).
  1567. ix(6724) :- ix(6561).
  1568. ix(6889) :- ix(6724).
  1569. ix(7056) :- ix(6889).
  1570. ix(7225) :- ix(7056).
  1571. ix(7396) :- ix(7225).
  1572. ix(7569) :- ix(7396).
  1573. ix(7744) :- ix(7569).
  1574. ix(7921) :- ix(7744).
  1575. ix(8100) :- ix(7921).
  1576. ix(8281) :- ix(8100).
  1577. ix(8464) :- ix(8281).
  1578. ix(8649) :- ix(8464).
  1579. ix(8836) :- ix(8649).
  1580. ix(9025) :- ix(8836).
  1581. ix(9216) :- ix(9025).
  1582. ix(9409) :- ix(9216).
  1583. ix(9604) :- ix(9409).
  1584. ix(9801) :- ix(9604).
  1585. ix(10000) :- ix(9801).
  1586.  
  1587. % 19. Make 1000 asserts of unit clauses
  1588.  
  1589. create_units(I, N, []) :- I > N, !.
  1590. create_units(I, N, [ua(K, X, f(K, X))|Rest]) :-
  1591.     K is I * (1 + I//100),
  1592.     J is I + 1,
  1593.     create_units(J, N, Rest).
  1594.  
  1595. assert_clauses([]).
  1596. assert_clauses([Clause|Rest]) :-
  1597.    assert(Clause),
  1598.    assert_clauses(Rest).
  1599.  
  1600. % 20. Access 100 dynamically-created clauses with 1st arg. instantiated
  1601.  
  1602. dix_clauses(I, N, []) :- I > N, !.
  1603. dix_clauses(I, N, [dix(P, Q) | L]) :-
  1604.    I =< N,
  1605.    P is I*I,
  1606.    R is 1 + (I+N-2) mod N,
  1607.    Q is R*R,
  1608.    J is I + 1,
  1609.    dix_clauses(J, N, L).
  1610.  
  1611. access_dix(Start, End) :-
  1612.    dix(Start, Where),
  1613.  ( Where = End -> true ; access_dix(Where, End) ).
  1614.  
  1615. % 21. Access 100 dynamic unit clauses (2nd argument instantiated)
  1616.  
  1617. access_back(Start, End) :-
  1618.    dix(Where, Start),
  1619.  ( Where = End -> true ; access_back(Where, End) ).
  1620.  
  1621. % 22. Setof and bagof
  1622.  
  1623. pr(99, 1).
  1624. pr(98, 2).
  1625. pr(97, 3).
  1626. pr(96, 4).
  1627. pr(95, 5).
  1628. pr(94, 6).
  1629. pr(93, 7).
  1630. pr(92, 8).
  1631. pr(91, 9).
  1632. pr(90, 10).
  1633. pr(89, 11).
  1634. pr(88, 12).
  1635. pr(87, 13).
  1636. pr(86, 14).
  1637. pr(85, 15).
  1638. pr(84, 16).
  1639. pr(83, 17).
  1640. pr(82, 18).
  1641. pr(81, 19).
  1642. pr(80, 20).
  1643. pr(79, 21).
  1644. pr(78, 22).
  1645. pr(77, 23).
  1646. pr(76, 24).
  1647. pr(75, 25).
  1648. pr(74, 26).
  1649. pr(73, 27).
  1650. pr(72, 28).
  1651. pr(71, 29).
  1652. pr(70, 30).
  1653. pr(69, 31).
  1654. pr(68, 32).
  1655. pr(67, 33).
  1656. pr(66, 34).
  1657. pr(65, 35).
  1658. pr(64, 36).
  1659. pr(63, 37).
  1660. pr(62, 38).
  1661. pr(61, 39).
  1662. pr(60, 40).
  1663. pr(59, 41).
  1664. pr(58, 42).
  1665. pr(57, 43).
  1666. pr(56, 44).
  1667. pr(55, 45).
  1668. pr(54, 46).
  1669. pr(53, 47).
  1670. pr(52, 48).
  1671. pr(51, 49).
  1672. pr(50, 50).
  1673. pr(49, 51).
  1674. pr(48, 52).
  1675. pr(47, 53).
  1676. pr(46, 54).
  1677. pr(45, 55).
  1678. pr(44, 56).
  1679. pr(43, 57).
  1680. pr(42, 58).
  1681. pr(41, 59).
  1682. pr(40, 60).
  1683. pr(39, 61).
  1684. pr(38, 62).
  1685. pr(37, 63).
  1686. pr(36, 64).
  1687. pr(35, 65).
  1688. pr(34, 66).
  1689. pr(33, 67).
  1690. pr(32, 68).
  1691. pr(31, 69).
  1692. pr(30, 70).
  1693. pr(29, 71).
  1694. pr(28, 72).
  1695. pr(27, 73).
  1696. pr(26, 74).
  1697. pr(25, 75).
  1698. pr(24, 76).
  1699. pr(23, 77).
  1700. pr(22, 78).
  1701. pr(21, 79).
  1702. pr(20, 80).
  1703. pr(19, 81).
  1704. pr(18, 82).
  1705. pr(17, 83).
  1706. pr(16, 84).
  1707. pr(15, 85).
  1708. pr(14, 86).
  1709. pr(13, 87).
  1710. pr(12, 88).
  1711. pr(11, 89).
  1712. pr(10, 90).
  1713. pr(9, 91).
  1714. pr(8, 92).
  1715. pr(7, 93).
  1716. pr(6, 94).
  1717. pr(5, 95).
  1718. pr(4, 96).
  1719. pr(3, 97).
  1720. pr(2, 98).
  1721. pr(1, 99).
  1722. pr(0, 100).
  1723.  
  1724. %23a calls to functor/3 with second and third argument uninstantiated
  1725.  
  1726. functors(0).
  1727. functors(4).
  1728.  
  1729. functor_in(T) :-
  1730.     functor(T, _, _),
  1731.     functor(T, _, _),
  1732.     functor(T, _, _),
  1733.     functor(T, _, _),
  1734.     functor(T, _, _),
  1735.     functor(T, _, _),
  1736.     functor(T, _, _),
  1737.     functor(T, _, _),
  1738.     functor(T, _, _),
  1739.     functor(T, _, _),
  1740.     functor(T, _, _),
  1741.     functor(T, _, _),
  1742.     functor(T, _, _),
  1743.     functor(T, _, _),
  1744.     functor(T, _, _),
  1745.     functor(T, _, _),
  1746.     functor(T, _, _),
  1747.     functor(T, _, _),
  1748.     functor(T, _, _),
  1749.     functor(T, _, _).
  1750.  
  1751. %23b calls to functor/3 with first argument uninstantiated
  1752.  
  1753. functor_out(F, N) :-
  1754.     functor(_, F, N),
  1755.     functor(_, F, N),
  1756.     functor(_, F, N),
  1757.     functor(_, F, N),
  1758.     functor(_, F, N),
  1759.     functor(_, F, N),
  1760.     functor(_, F, N),
  1761.     functor(_, F, N),
  1762.     functor(_, F, N),
  1763.     functor(_, F, N),
  1764.     functor(_, F, N),
  1765.     functor(_, F, N),
  1766.     functor(_, F, N),
  1767.     functor(_, F, N),
  1768.     functor(_, F, N),
  1769.     functor(_, F, N),
  1770.     functor(_, F, N),
  1771.     functor(_, F, N),
  1772.     functor(_, F, N),
  1773.     functor(_, F, N).
  1774.  
  1775. %23c calls to functor/3 with all arguments instantiated
  1776.  
  1777. functor_unify(T, F, N) :-
  1778.     functor(T, F, N),
  1779.     functor(T, F, N),
  1780.     functor(T, F, N),
  1781.     functor(T, F, N),
  1782.     functor(T, F, N),
  1783.     functor(T, F, N),
  1784.     functor(T, F, N),
  1785.     functor(T, F, N),
  1786.     functor(T, F, N),
  1787.     functor(T, F, N),
  1788.     functor(T, F, N),
  1789.     functor(T, F, N),
  1790.     functor(T, F, N),
  1791.     functor(T, F, N),
  1792.     functor(T, F, N),
  1793.     functor(T, F, N),
  1794.     functor(T, F, N),
  1795.     functor(T, F, N),
  1796.     functor(T, F, N),
  1797.     functor(T, F, N).
  1798.  
  1799. %24 measures the metacall
  1800. call_test(G) :-
  1801.     call(G),
  1802.     call(G),
  1803.     call(G),
  1804.     call(G),
  1805.     call(G),
  1806.     call(G),
  1807.     call(G),
  1808.     call(G),
  1809.     call(G),
  1810.     call(G).
  1811.  
  1812. call_dummy(number(_)) :-
  1813.     number(1),
  1814.     number(1),
  1815.     number(1),
  1816.     number(1),
  1817.     number(1),
  1818.     number(1),
  1819.     number(1),
  1820.     number(1),
  1821.     number(1),
  1822.     number(1).
  1823. call_dummy(_ == _) :-
  1824.     a == a,
  1825.     a == a,
  1826.     a == a,
  1827.     a == a,
  1828.     a == a,
  1829.     a == a,
  1830.     a == a,
  1831.     a == a,
  1832.     a == a,
  1833.     a == a.
  1834. call_dummy(dummy) :-
  1835.     dummy,
  1836.     dummy,
  1837.     dummy,
  1838.     dummy,
  1839.     dummy,
  1840.     dummy,
  1841.     dummy,
  1842.     dummy,
  1843.     dummy,
  1844.     dummy,
  1845.     dummy.
  1846. call_dummy(dummy(_, _, _)) :-
  1847.     dummy(_, _, _),
  1848.     dummy(_, _, _),
  1849.     dummy(_, _, _),
  1850.     dummy(_, _, _),
  1851.     dummy(_, _, _),
  1852.     dummy(_, _, _),
  1853.     dummy(_, _, _),
  1854.     dummy(_, _, _),
  1855.     dummy(_, _, _),
  1856.     dummy(_, _, _).
  1857.  
  1858. call_goal(number(1)).
  1859. call_goal(a == a).
  1860. call_goal(dummy).
  1861. call_goal(dummy(_, _, _)).
  1862.  
  1863. %%25 measures output
  1864. %
  1865. %write_1(File, Term) :-
  1866. %    open(File, write, S),
  1867. %    write(S, Term), write(S, '.'), nl(S),
  1868. %    close(S).
  1869. %
  1870. %write_2(File, Term) :-
  1871. %    open(File, write, S),
  1872. %    writeq(S, Term), write(S, '.'), nl(S),
  1873. %    writeq(S, Term), write(S, '.'), nl(S),
  1874. %    close(S).
  1875. %
  1876. %%26 measures input
  1877. %
  1878. %read_1(File, Term) :-
  1879. %    open(File, read, S),
  1880. %    read(S, Term),
  1881. %    close(S).
  1882. %
  1883. %read_2(File, Term) :-
  1884. %    open(File, read, S),
  1885. %    read(S, Term),
  1886. %    read(S, Term),
  1887. %    close(S).
  1888.  
  1889. % Queries, dummy control predicates and programs
  1890.  
  1891. % Queries
  1892.  
  1893. % 1
  1894. bench_mark(tail_call_atom_atom, 6000, p1(a), dummy(a)).
  1895.  
  1896. % 2
  1897. bench_mark(binary_call_atom_atom, 6000, q1(a), dummy(a)).
  1898.  
  1899. % 3
  1900. bench_mark(cons_list, 6000, r1(L), dummy(L)).
  1901.  
  1902. % 4
  1903. bench_mark(walk_list, 6000, r1(L), dummy(L)) :- r1(L).
  1904.  
  1905. % 5
  1906. bench_mark(walk_list_rec, 6000, wlr(L), dummy(L)) :- r1(L).
  1907.  
  1908. % 6
  1909. bench_mark(args(N), 6000, args(N, L), dummy(N, L)) :- args(N), r1(L).
  1910.  
  1911. % 7
  1912. bench_mark(cons_term, 6000, s1(T), dummy(T)).
  1913.  
  1914. % 8
  1915. bench_mark(walk_term, 6000, s1(T), dummy(T)) :- s1(T).
  1916.  
  1917. % 9
  1918. bench_mark(walk_term_rec, 6000, wtr(T), dummy(T)) :- s1(T).
  1919.  
  1920. % 10
  1921. bench_mark(shallow_backtracking, 6000, shallow, dummy).
  1922.  
  1923. % 11
  1924. bench_mark(deep_backtracking, 6000, deep, dummy).
  1925.  
  1926. % 12
  1927. bench_mark(choice_point, 6000, choice, dummy).
  1928.  
  1929. % 13
  1930. bench_mark(trail_variables, 6000, trail, dummy).
  1931.  
  1932. % 14
  1933. bench_mark(medium_unify, 12000, equal(Term1, Term2), dummy(Term1, Term2)) :-
  1934.    term64(Term1),
  1935.    term64(Term2).
  1936. bench_mark(deep_unify, 300, equal(Term1, Term2), dummy(Term1, Term2)) :-
  1937.    term4096(Term1),
  1938.    term4096(Term2).
  1939.  
  1940. % 15
  1941. bench_mark(integer_add, 3000, a1(0, 1, R), dummy(0, 1, R)).
  1942.  
  1943. % 16
  1944. bench_mark(floating_add, 3000, fa1(0.1, 1.1, R), dummy(0.1, 1.1, R)).
  1945.  
  1946. % 17
  1947. bench_mark(arg(N), 6000, arg1(N, Term, R), dummy(N, Term, R)) :-
  1948.    args(N),
  1949.    complex_nary_term(100, N, Term).
  1950.  
  1951. % 18
  1952. bench_mark(index, 6000, ix(1), dummy(1)).
  1953.  
  1954. % 19
  1955. bench_mark(assert_unit, 3, assert_clauses(L), dummy(L)) :-
  1956.    abolish(ua,3),
  1957.    create_units(1, 1000, L).
  1958.  
  1959. % 20
  1960. bench_mark(access_unit, 300, access_dix(1, 1), dummy(1, 1)) :-
  1961.    abolish(dix, 2),
  1962.    dix_clauses(1, 100, L),
  1963.    assert_clauses(L).
  1964.  
  1965. % 21
  1966. bench_mark(slow_access_unit, 30, access_back(1, 1), dummy(1, 1)) :-
  1967.    abolish(dix, 2),
  1968.    dix_clauses(1, 100, L),
  1969.    assert_clauses(L).
  1970.  
  1971. % 22
  1972. bench_mark(setof, 30, setof(X, Y^pr(X, Y), S), dummy(X, Y^pr(X, Y), S)).
  1973. bench_mark(pair_setof, 30,
  1974.    setof((X,Y), pr(X, Y), S),
  1975.    dummy((X,Y), pr(X, Y), S)).
  1976. bench_mark(double_setof, 30, setof((X,S), setof(Y, pr(X, Y), S), T),
  1977.                        dummy(S, setof(Y, pr(X, Y), S), T)).
  1978. bench_mark(bagof, 30, bagof(X, Y^pr(X, Y), S), dummy(X, Y^pr(X, Y), S)).
  1979.  
  1980. % 23a
  1981. bench_mark(functor_in(N), 2000, functor_in(T), dummy(T)) :-
  1982.    functors(N),
  1983.    functor(T, f, N).
  1984.  
  1985. % 23b
  1986. bench_mark(functor_out(N), 2000, functor_out(f, N), dummy(f, N)) :-
  1987.    functors(N).
  1988.  
  1989. % 23c
  1990. bench_mark(functor_unify(N), 2000, functor_unify(T, f, N), dummy(T, f, N)) :-
  1991.    functors(N),
  1992.    functor(T, f, N).
  1993.  
  1994. % 24
  1995. bench_mark(call_test(G), 2000, call_test(G), call_dummy(G)) :-
  1996.    call_goal(G).
  1997.  
  1998. %% 25
  1999. %bench_mark(write(1), 200, write_1(File, T), dummy(File, T)) :- 
  2000. %    File = '/tmp/bench.pl', s1(T).
  2001. %
  2002. %bench_mark(write(2), 50, write_2(File, T), dummy(File, T)) :- 
  2003. %    File = '/tmp/bench.pl', s1(T).
  2004. %
  2005. %% 26
  2006. %bench_mark(read(1), 200, read_1(File, _), dummy(File, _)) :- 
  2007. %    File = '/tmp/bench.pl', s1(T), write_1(File, T).
  2008. %
  2009. %bench_mark(read(2), 50, read_2(File, _), dummy(File, _)) :- 
  2010. %    File = '/tmp/bench.pl', s1(T), write_2(File, T).
  2011.  
  2012.  
  2013. get_cpu_time(T) :- statistics(runtime, [T|_]).
  2014.  
  2015. time_unit(ms).
  2016.  
  2017. %   repeat(N)
  2018. %   succeeds precisely N times.
  2019.  
  2020. repeat(N) :-
  2021.         N > 0,
  2022.     repeat_(N).
  2023.  
  2024. repeat_(N) :- N < 2, !.
  2025. repeat_(_).
  2026. repeat_(N) :- M is N - 1, repeat_(M).
  2027.  
  2028. %   bench_mark(Name)
  2029. %   is the top level.  It calls bench_mark_/4 to find out 
  2030. %   how many Iterations of the Action and its Control to perform.
  2031.  
  2032. get_iterations_(ProbeIterations, Action, Iterations) :-
  2033.     get_cpu_time(T0),
  2034.     (
  2035.         repeat(ProbeIterations), call(Action), fail 
  2036.     ;
  2037.         get_cpu_time(T1)
  2038.     ),
  2039.     T is T1 - T0,
  2040.     (T < 1000 ->     % too close to UNIX clock resolution
  2041.         ProbeIterations1 is 10 * ProbeIterations,
  2042.         get_iterations_(ProbeIterations1, Action, Iterations)
  2043.     ;
  2044.         ProbeT is T / ProbeIterations,
  2045.         (ProbeT > 5000 ->
  2046.             Iterations = 1
  2047.         ;
  2048.             Iterations is 5000 / ProbeT
  2049.         )
  2050.     ).
  2051.  
  2052. get_iterations(Action, Iterations) :-
  2053.     get_iterations_(1, Action, Iterations).
  2054.  
  2055. %   report(N, UT0, UT1, UT2)
  2056. %   takes the three times yielded by times and the number
  2057. %   of iterations and prints the total, overhead, and average of the
  2058. %   user cpu time.
  2059.  
  2060. report(N, UT0, UT1, UT2) :-
  2061.         UTestTime is UT1-UT0,
  2062.         UOverHead is UT2-UT1,
  2063.         UAverage  is (UTestTime-UOverHead)/N,
  2064.     write(' user cpu '), 
  2065.         write((UTestTime-UOverHead)/N), write(' = '), write(UAverage),
  2066.     write(' '), time_unit(TimeUnit), write(TimeUnit), write('/iteration'),
  2067.     nl.
  2068.  
  2069.  
  2070. bench_mark_(Name, Iterations, Action, Control) :-
  2071.     bench_mark(Name, _, Action, Control),
  2072.     get_iterations(Action, Iterations).
  2073.  
  2074. bench_mark(Name) :-
  2075.         bench_mark_(Name, Iterations, Action, Control),
  2076.         get_cpu_time(UT0),
  2077.         (   repeat(Iterations), call(Action), fail
  2078.         ;   get_cpu_time(UT1)
  2079.         ),
  2080.         (   repeat(Iterations), call(Control), fail
  2081.         ;   get_cpu_time(UT2)
  2082.         ),
  2083.         write(Name), write(' took '), nl,
  2084.         report(Iterations, UT0, UT1, UT2).
  2085.  
  2086. %   bench_mark_(Name, Iterations, Action, Control)
  2087. %   The number of iterations is computed so that the overall cputime of
  2088. %   calling Iterations times Action lasts at least 20s. This was previously
  2089. %   hardwired in bench_mark/4.
  2090.  
  2091. go :-
  2092.     bench_mark(_),
  2093.     fail.
  2094. go.
  2095.  
  2096. g:-bench_mark(deep_unify).
  2097.